package cn.tedu.travelsystem.base.aspect;

import cn.tedu.travelsystem.base.exception.AccessLimitException;
import cn.tedu.travelsystem.base.utils.AccessLimitUtil;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;

@Aspect
@Component
public class AccessLimitAspect {

    @Autowired
    private AccessLimitUtil accessLimitUtil; // 用来限制频繁访问的工具类

    @Autowired
    private HttpServletRequest request; // 获取请求的 IP 地址

    // 定义切点，拦截所有有 @RequestMapping 注解的方法
    @Pointcut("@annotation(org.springframework.web.bind.annotation.RequestMapping)")
    public void requestMappingMethods() {}

    // 在执行请求之前，进行频繁访问检测
    @Before("requestMappingMethods()")
    public void beforeRequest() {
        String ip = request.getRemoteAddr(); // 获取请求的 IP 地址
        String key = "limit:ip:" + ip; // 每个 IP 地址的请求限制
        if (accessLimitUtil.isFrequent(key, 20, 60)) { // 每个 IP 60 秒内最多请求 20 次
            throw new AccessLimitException("频繁访问，超过请求次数限制");
        }
    }
}
